﻿using System;

namespace Lesson9_封装_拓展方法
{
    #region 一 基本概念
    //概念：
    //为现有非静态变量类型 添加新方法
    //作用：
    //1.提升程序拓展性
    //2.不需要在对象中重写方法
    //3.不需要继承来添加方法
    //4.为别人封装的类型写额外的方法
    //特点：
    //1.一定是写在静态类中
    //2.一定是个静态函数
    //3.第一个参数是拓展目标 第二个参数视为传入的首个参数
    //4.第一个参数用this修饰
    #endregion

    #region 二 基本语法
    //访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型1 参数名1, 参数类型2 参数名2, ......)
    //拓展类名：需要被添加拓展方法的变量类型
    #endregion

    #region 三 实例
    static class Test
    {
        //为string类型申明一个 用于将字符串分隔为字符数组并返回的 拓展方法
        public static string[] GetStringArray(this string str)
        {
            return str.Split(' ');
        }

        //为自定义的Class类型申明一个拓展方法
        public static void ClassFun2(this Class c)
        {
            Console.WriteLine("Class类型的拓展方法");
        }
    }
    #endregion

    #region 五 为自定义的类型拓展方法
    class Class
    {
        public void ClassFun1()
        {
            Console.WriteLine("Class的成员方法");
        }
    }
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            #region 四 拓展方法的使用
            string[] str = Test.GetStringArray("123 456 789");
            for(int i = 0; i < str.Length; i++)
            {
                Console.WriteLine(str[i]);
            }
            #endregion

            Class c = new Class();
            c.ClassFun2();
            //拓展方法与成员方法同名 若同名 调用时会使用成员方法

        }
    }
}